home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xarchie-2.0.9 / FWF / Dir / Directory.c next >
C/C++ Source or Header  |  1995-06-18  |  6KB  |  235 lines

  1. /****************************************************************************
  2.  
  3.         Directory.c
  4.  
  5.     This file contains the C code that implements the directory
  6.     iteration and file information subsystem.
  7.  
  8.     This code is intended to be used as a convenient, machine
  9.     independent interface to iterate through the contents of a
  10.     directory.
  11.  
  12.  ****************************************************************************/
  13. /*
  14.  * Copyright 1990,1991,1992 Brian Totty
  15.  * 
  16.  * Permission to use, copy, modify, distribute, and sell this software
  17.  * and its documentation for any purpose is hereby granted without fee,
  18.  * provided that the above copyright notice appears in all copies and that
  19.  * both that copyright notice and this permission notice appear in
  20.  * supporting documentation, and that the name of Brian Totty or
  21.  * University of Illinois not be used in advertising or publicity
  22.  * pertaining to distribution of the software without specific, written
  23.  * prior permission.  Brian Totty and University of Illinois make no
  24.  * representations about the suitability of this software for any
  25.  * purpose.  It is provided "as is" without express or implied warranty.
  26.  *
  27.  * Brian Totty and University of Illinois disclaim all warranties with
  28.  * regard to this software, including all implied warranties of
  29.  * merchantability and fitness, in no event shall Brian Totty or
  30.  * University of Illinois be liable for any special, indirect or
  31.  * consequential damages or any damages whatsoever resulting from loss of
  32.  * use, data or profits, whether in an action of contract, negligence or
  33.  * other tortious action, arising out of or in connection with the use or
  34.  * performance of this software.
  35.  *
  36.  * Author:
  37.  *     Brian Totty
  38.  *     Department of Computer Science
  39.  *     University Of Illinois at Urbana-Champaign
  40.  *    1304 West Springfield Avenue
  41.  *     Urbana, IL 61801
  42.  * 
  43.  *     totty@cs.uiuc.edu
  44.  *     
  45.  */ 
  46.  
  47. #include <Directory.h>
  48. #include <RegExp.h>
  49.  
  50. /*--------------------------------------------------------------------------*
  51.  
  52.         L O W    L E V E L    D I R E C T O R Y    I N T E R F A C E
  53.  
  54.  *--------------------------------------------------------------------------*/
  55.  
  56. int DirectoryOpen(dir_name,dp)
  57. char *dir_name;
  58. Directory *dp;
  59. {
  60.     DirectoryDir(dp) = opendir(dir_name);
  61.     if (DirectoryDir(dp) == NULL) return(FALSE);
  62.     if (DirectoryPathExpand(dir_name,DirectoryPath(dp)) == NULL)
  63.     {
  64.         closedir(DirectoryDir(dp));
  65.         return(FALSE);
  66.     }
  67.     return(TRUE);
  68. } /* End DirectoryOpen */
  69.  
  70.  
  71. void DirectoryRestart(dp)
  72. Directory *dp;
  73. {
  74.     rewinddir(DirectoryDir(dp));
  75. } /* End DirectoryRestart */
  76.  
  77.  
  78. void DirectoryClose(dp)
  79. Directory *dp;
  80. {
  81.     closedir(DirectoryDir(dp));
  82. } /* End DirectoryClose */
  83.  
  84.  
  85. long DirectoryTellPosition(dp)
  86. Directory *dp;
  87. {
  88.     return(telldir(DirectoryDir(dp)));
  89. } /* End DirectoryTellPosition */
  90.  
  91.  
  92. void DirectorySetPosition(dp,pos)
  93. Directory *dp;
  94. long pos;
  95. {
  96.     seekdir(DirectoryDir(dp),pos);
  97. } /* End DirectorySetPosition */
  98.  
  99.  
  100. int DirectoryReadNextEntry(dp,de)
  101. Directory *dp;
  102. DirEntry *de;
  103. {
  104.     u_short orig_file_type;
  105.     static struct dirent *_ep;
  106.     static struct stat _lstats,_stats;
  107.     char full_path[MAXPATHLEN + 2];
  108.  
  109.     _ep = readdir(DirectoryDir(dp));
  110.     if (_ep == NULL) return(FALSE);
  111.     strcpy(DirEntryFileName(de),_ep->d_name);
  112.     strcpy(full_path,DirectoryPath(dp));
  113.     strcat(full_path,DirEntryFileName(de));
  114.  
  115.     if (lstat(full_path,&_lstats) != 0) return(FALSE);
  116.  
  117.     orig_file_type = _lstats.st_mode & S_IFMT;
  118.     switch (orig_file_type)
  119.     {
  120.         case S_IFDIR:
  121.         DirEntryType(de) = F_TYPE_DIR;
  122.         break;
  123.         case S_IFREG:
  124.         DirEntryType(de) = F_TYPE_FILE;
  125.         break;
  126.         case S_IFCHR:
  127.         DirEntryType(de) = F_TYPE_CHAR_SPECIAL;
  128.         break;
  129.         case S_IFBLK:
  130.         DirEntryType(de) = F_TYPE_BLOCK_SPECIAL;
  131.         break;
  132.         case S_IFLNK:
  133.         DirEntryType(de) = F_TYPE_SYM_LINK;
  134.         break;
  135. #ifdef S_IFSOCK
  136.         case S_IFSOCK:
  137.         DirEntryType(de) = F_TYPE_SOCKET;
  138.         break;
  139. #endif
  140. #ifdef S_IFIFO
  141.         case S_IFIFO:
  142.         DirEntryType(de) = F_TYPE_FIFO;
  143.         break;
  144. #endif
  145.         default:
  146.         DirEntryType(de) = orig_file_type;
  147.         break;
  148.     }
  149.  
  150.     DirEntryIsBrokenLink(de) = FALSE;
  151.     DirEntryIsDirectoryLink(de) = FALSE;
  152.     if (DirEntryIsSymLink(de))            /* Symbolic Link */
  153.     {
  154.         if (stat(full_path,&_stats) != 0)    /* Can't Stat File */
  155.         {
  156.             DirEntryIsBrokenLink(de) = TRUE;
  157.             _stats = _lstats;
  158.         }
  159.             else                /* Link Not Broken */
  160.         {
  161. #ifdef SLOW_DIRLINK_TEST
  162.                 char temp_path[MAXPATHLEN + 2];
  163.             if (DirectoryPathExpand(full_path,temp_path) != NULL)
  164.             {
  165. #else
  166.             if ((_stats.st_mode & S_IFMT) == S_IFDIR)
  167.             {
  168. #endif
  169.                 DirEntryIsDirectoryLink(de) = TRUE;
  170.             }
  171.  
  172.         }
  173.     }
  174.         else                    /* Not Symbolic Link */
  175.     {
  176.         _stats = _lstats;
  177.     }
  178.  
  179.     FileInfoOrigMode(DirEntrySelfInfo(de)) = _lstats.st_mode;
  180.     FileInfoProt(DirEntrySelfInfo(de)) = _lstats.st_mode & 0777;
  181.     FileInfoUserID(DirEntrySelfInfo(de)) = _lstats.st_uid;
  182.     FileInfoGroupID(DirEntrySelfInfo(de)) = _lstats.st_gid;
  183.     FileInfoFileSize(DirEntrySelfInfo(de)) = _lstats.st_size;
  184.     FileInfoLastAccess(DirEntrySelfInfo(de)) = _lstats.st_atime;
  185.     FileInfoLastModify(DirEntrySelfInfo(de)) = _lstats.st_mtime;
  186.     FileInfoLastStatusChange(DirEntrySelfInfo(de)) = _lstats.st_ctime;
  187.  
  188.     FileInfoOrigMode(DirEntryActualInfo(de)) = _stats.st_mode;
  189.     FileInfoProt(DirEntryActualInfo(de)) = _stats.st_mode & 0777;
  190.     FileInfoUserID(DirEntryActualInfo(de)) = _stats.st_uid;
  191.     FileInfoGroupID(DirEntryActualInfo(de)) = _stats.st_gid;
  192.     FileInfoFileSize(DirEntryActualInfo(de)) = _stats.st_size;
  193.     FileInfoLastAccess(DirEntryActualInfo(de)) = _stats.st_atime;
  194.     FileInfoLastModify(DirEntryActualInfo(de)) = _stats.st_mtime;
  195.     FileInfoLastStatusChange(DirEntryActualInfo(de)) = _stats.st_ctime;
  196.  
  197.     return(TRUE);
  198. } /* End DirectoryReadNextEntry */
  199.  
  200.  
  201. char *DirectoryPathExpand(old_path,new_path)
  202. char *old_path,*new_path;
  203. {
  204.     register char *p;
  205.     char path[MAXPATHLEN + 2];
  206.  
  207.     if (getwd(path) == NULL) return(NULL);
  208.     if (chdir(old_path) != 0) return(NULL);
  209.     if (getwd(new_path) == NULL) strcpy(new_path,old_path);
  210.     if (chdir(path) != 0) return(NULL);
  211.     for (p = new_path; *p != '\0'; p++)
  212.         /*EMPTY*/;
  213.     if ((p != new_path) && *(p - 1) != '/')
  214.     {
  215.         *p++ = '/';
  216.         *p = '\0';
  217.     }
  218.     return(new_path);
  219. } /* End DirectoryPathExpand */
  220.  
  221.  
  222. /*---------------------------------------------------------------------------*
  223.  
  224.              D I R E C T O R Y    E N T R Y    R O U T I N E S
  225.  
  226.  *---------------------------------------------------------------------------*/
  227.  
  228. void DirEntryDump(fp,de)
  229. FILE *fp;
  230. DirEntry *de;
  231. {
  232.     fprintf(fp,"%20s, Size %7d, Prot %3o\n",
  233.         DirEntryFileName(de),DirEntryFileSize(de),DirEntryProt(de));
  234. } /* End DirEntryDump */
  235.